#include "logindialog.h"
#include "ui_logindialog.h"
#include <QApplication>

LoginDialog::LoginDialog(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::LoginDialog)
    , m_dbManager(new DatabaseManager(this))
    , m_mainWindow(nullptr)
    , m_registerDialog(nullptr)
{
    ui->setupUi(this);
    
    // 设置窗口属性：保留标准窗口外观，不使用透明与无边框
    setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground, false);
    
    // 设置窗口标题
    setWindowTitle("用户登录系统");
    
    // 连接信号和槽
    connect(ui->usernameEdit, &QLineEdit::returnPressed, this, &LoginDialog::on_usernameEdit_returnPressed);
    connect(ui->passwordEdit, &QLineEdit::returnPressed, this, &LoginDialog::on_passwordEdit_returnPressed);
    
    // 设置焦点到用户名输入框
    ui->usernameEdit->setFocus();
    
    // 检查数据库连接
    if (!m_dbManager->isConnected()) {
        showError("数据库连接失败，请检查系统配置！");
    }

    // 当主窗口请求登出时，登录窗口恢复显示并复位输入
    // 注意：m_mainWindow 在首次登录后创建，此处连接在创建后也会再次设置
}

LoginDialog::~LoginDialog()
{
    delete ui;
}

void LoginDialog::keyPressEvent(QKeyEvent *event)
{
    // 处理ESC键退出
    if (event->key() == Qt::Key_Escape) {
        close();
    }
    QWidget::keyPressEvent(event);
}

void LoginDialog::on_loginButton_clicked()
{
    // 获取输入的用户名和密码
    QString username = ui->usernameEdit->text().trimmed();
    QString password = ui->passwordEdit->text();
    
    // 验证输入
    if (username.isEmpty()) {
        showError("请输入用户名！");
        ui->usernameEdit->setFocus();
        return;
    }
    
    if (password.isEmpty()) {
        showError("请输入密码！");
        ui->passwordEdit->setFocus();
        return;
    }
    
    // 验证登录
    if (validateLogin(username, password)) {
        // 登录成功，获取用户信息
        User user = m_dbManager->findUserByUsername(username);
        showSuccess("登录成功！");
        clearInputs();
        openMainWindow(user);
    } else {
        // 登录失败
        showError("用户名或密码错误！");
        ui->passwordEdit->clear();
        ui->passwordEdit->setFocus();
    }
}

void LoginDialog::on_registerButton_clicked()
{
    openRegisterDialog();
}

void LoginDialog::on_exitButton_clicked()
{
    close();
}

void LoginDialog::on_usernameEdit_returnPressed()
{
    // 用户名输入框回车，焦点移到密码框
    ui->passwordEdit->setFocus();
}

void LoginDialog::on_passwordEdit_returnPressed()
{
    // 密码输入框回车，触发登录
    on_loginButton_clicked();
}

bool LoginDialog::validateLogin(const QString &username, const QString &password)
{
    // 从数据库查找用户
    User user = m_dbManager->findUserByUsername(username);
    
    // 检查用户是否存在
    if (user.getId() == 0) {
        return false;
    }
    
    // 验证密码
    return user.validatePassword(password);
}

void LoginDialog::showError(const QString &message)
{
    QMessageBox::critical(this, "错误", message, QMessageBox::Ok);
}

void LoginDialog::showSuccess(const QString &message)
{
    QMessageBox::information(this, "成功", message, QMessageBox::Ok);
}

void LoginDialog::clearInputs()
{
    ui->usernameEdit->clear();
    ui->passwordEdit->clear();
    ui->usernameEdit->setFocus();
}

void LoginDialog::openMainWindow(const User &user)
{
    // 创建主窗口
    if (!m_mainWindow) {
        // 创建独立的主窗口（不要以登录窗口为父，否则隐藏父窗口会连带隐藏子窗口）
        m_mainWindow = new MainWindow(user, nullptr);
        m_mainWindow->setAttribute(Qt::WA_DeleteOnClose, true);
        // 连接主窗口的登出信号
        connect(m_mainWindow, &MainWindow::logoutRequested, this, [this]() {
            // 清空输入并显示登录窗口
            clearInputs();
            this->show();
            // 主窗口销毁后将指针置空
            m_mainWindow = nullptr;
        });
    } else {
        m_mainWindow->setCurrentUser(user);
    }
    
    // 显示主窗口
    m_mainWindow->show();
    // 打开主窗口时隐藏当前登录窗口
    this->hide();
}

void LoginDialog::openRegisterDialog()
{
    // 创建注册窗口
    if (!m_registerDialog) {
        // 创建独立的注册窗口（不要以登录窗口为父，否则隐藏父窗口会连带隐藏子窗口）
        m_registerDialog = new RegisterDialog(nullptr);
        m_registerDialog->setWindowFlag(Qt::Window, true);
        m_registerDialog->setAttribute(Qt::WA_DeleteOnClose, true);
        // 注册成功时立即恢复登录窗口
        connect(m_registerDialog, &RegisterDialog::registrationSucceeded, this, [this]() {
            this->show();
            this->clearInputs();
        });
        // 关闭注册窗口时恢复登录窗口并置空指针
        connect(m_registerDialog, &QObject::destroyed, this, [this]() {
            this->show();
            this->clearInputs();
            m_registerDialog = nullptr;
        });
    }
    // 显示注册窗口并隐藏当前登录窗口
    m_registerDialog->show();
    this->hide();
}
